const add = (payload, callback) => {
  callback(payload.a, payload.b)
}

const ceshi = (a, b = 3) => {
  console.log(a + b)
  return a + b
}
let add2 = fn => a => b => fn.call(this, a, b)
// add2(ceshi)(1)(8)

/////////////////////////
const payload = {
  a: 1,
  b: 2
}
const k = fn => (...ags) => callback => fn.call(this, ...ags, callback)
// k(add)(payload)((a,b) => console.log(a+b))


/////////bind可以预先对参数做一些颗粒化，可以预先设置一些参数
function foo(a,b){
  console.log(`a=${a},b=${b}`)
}
let bar = foo.bind(null,3)   //bind绑定之后会返回一个函数
// bar(4)



////////////////////
//把数组展开成参数时，使用null时有时候会对函数产生副作用，使之前的this发生改变，因此可以把null改为object.create(null),他比对象更空
let kong= Object.create(null)
// foo.apply(kong,[2,6])